package com.the_last.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.the_last.pojo.dto.IncrementalRolePermissionDTO;
import com.the_last.pojo.dto.SysRoleDTO;
import com.the_last.pojo.po.SysRole;
import com.the_last.pojo.po.SysPermission;
import com.the_last.utils.Result;

import java.util.List;

public interface ISysRoleService extends IService<SysRole> {
    
    /**
     * 分页获取角色列表
     *
     * @param page 分页参数
     * @param queryDTO 查询条件
     * @return 角色分页数据
     */
    Result<Page<SysRole>> getRoleList(Page<SysRole> page, SysRoleDTO queryDTO);
    
    /**
     * 获取用户角色列表
     *
     * @param userId 用户ID
     * @return 角色列表
     */
    Result<List<SysRole>> getRolesByUserId(Long userId);
    
    /**
     * 获取用户角色ID列表
     *
     * @param userId 用户ID
     * @return 角色ID列表
     */
    Result<List<Long>> getRoleIdsByUserId(Long userId);
    
    /**
     * 新增角色
     *
     * @param role 角色信息
     * @return 操作结果
     */
    Result<Void> addRole(SysRole role);
    
    /**
     * 更新角色
     *
     * @param role 角色信息
     * @return 操作结果
     */
    Result<Void> updateRole(SysRole role);
    
    /**
     * 删除角色
     *
     * @param id 角色ID
     * @return 操作结果
     */
    Result<Void> deleteRole(Long id);
    
    /**
     * 为角色分配权限
     *
     * @param roleId 角色ID
     * @param permissionIds 权限ID列表
     * @return 操作结果
     */
    Result<Void> assignPermissionsToRole(Long roleId, List<Long> permissionIds);
    
    /**
     * 增量分配角色权限（推荐使用）
     * 支持同时进行权限的增加和删除操作，避免全量替换
     *
     * @param incrementalDTO 增量操作DTO
     * @return 操作结果
     */
    Result<Void> incrementalAssignRolePermissions(IncrementalRolePermissionDTO incrementalDTO);
    
    /**
     * 获取角色的权限列表
     *
     * @param roleId 角色ID
     * @return 权限列表
     */
    Result<List<SysPermission>> getPermissionsByRoleId(Long roleId);
    
    /**
     * 移除角色的权限
     *
     * @param roleId 角色ID
     * @param permissionIds 权限ID列表
     * @return 操作结果
     */
    Result<Void> removePermissionsFromRole(Long roleId, List<Long> permissionIds);
    
    /**
     * 获取所有有效角色
     *
     * @return 角色列表
     */
    Result<List<SysRole>> getAllActiveRoles();
    
    /**
     * 批量启用/禁用角色
     *
     * @param roleIds 角色ID列表
     * @param status 状态（1-启用，0-禁用）
     * @return 操作结果
     */
    Result<Void> updateRoleStatus(List<Long> roleIds, Integer status);
    
}